package wanxiang

import (
	"fmt"
	"gitee.com/gam6it/SecToolkit/utils/http2"
)

/**
进程文件
*/

type Process struct {
	AgentId        string   `json:"agentId"`        // AgentID
	DisplayIP      string   `json:"displayIp"`      // 显示IP
	ConnectionIP   string   `json:"connectionIp"`   // 通信IP
	ExternalIP     string   `json:"externalIp"`     // 外网IP
	InternalIP     string   `json:"internalIp"`     // 内网IP
	BizGroupId     int      `json:"bizGroupId"`     // 业务组ID
	BizGroup       string   `json:"bizGroup"`       // 业务组名称
	Remark         string   `json:"remark"`         // 备注
	HostTagList    []string `json:"hostTagList"`    // 标签
	HostName       string   `json:"hostname"`       // 主机名
	Name           string   `json:"name"`           // 进程名
	PID            int      `json:"pid"`            // 进程ID
	PPID           int      `json:"ppid"`           // 父进程ID
	Path           string   `json:"path"`           // 进程路径
	StartArgs      string   `json:"startArgs"`      // 进程启动参数
	State          string   `json:"state"`          // 进程状态，仅linux可用
	UName          string   `json:"uname"`          // 用户名
	UID            int      `json:"uid"`            // 用户ID
	GName          string   `json:"gname"`          // 用户组名
	TTY            string   `json:"tty"`            // 进程启动的TTY，仅linux可用
	StartTime      string   `json:"startTime"`      // 进程启动时间
	PortCount      int      `json:"portCount"`      // 进程端口数
	Md5            string   `json:"md5"`            // 可执行文件md5
	InstallByPM    bool     `json:"installByPm"`    // 是否包管理器安装，Windows为空
	PackageVersion string   `json:"packageVersion"` // 进程对应软件包版本，仅linux可用
	PackageName    string   `json:"packageName"`    // 进程对应软件包名称，仅linux可用
	GID            int      `json:"gid"`            // 用户组id，仅linux可用
	Root           bool     `json:"root"`           // 是否root权限启动，仅linux可用
	Description    string   `json:"description"`    // 进程描述，仅windows可用
	Version        string   `json:"version"`        // 进程版本，仅windows可用
	Groups         []string `json:"groups"`         // 进程用户组，仅windows可用
	Type           int      `json:"type"`           // 进程类型，1-应用程序 2-后台程序 3-windows进程，仅windows可用
	SessionId      int      `json:"sessionId"`      // 会话ID，仅windows可用
	SessionName    string   `json:"sessionName"`    // 会话名，仅windows可用
	Size           int      `json:"size"`           // 进程可执行文件大小，仅windows可用
}

type ProcessFilterOption struct {
	OS              string `json:"-"` // win、linux
	Page            int    `json:"page"`
	Size            int    `json:"size"`
	AgentId         string `json:"agentId,omitempty"`
	Groups          string `json:"groups,omitempty"`
	HostName        string `json:"hostname,omitempty"`
	IP              string `json:"ip,omitempty"`
	StartTime       int64  `json:"startTime,omitempty"`
	Versions        string `json:"versions,omitempty"`
	Root            bool   `json:"root,omitempty"`
	PackageName     string `json:"packageName,omitempty"`
	PackageVersions string `json:"packageVersions,omitempty"`
	InstalledByPm   bool   `json:"installedByPm,omitempty"`
	PIDs            string `json:"pids,omitempty"`
	State           string `json:"state,omitempty"`
	Path            string `json:"path,omitempty"`
	UName           string `json:"uname,omitempty"`
	GName           string `json:"gname,omitempty"`
	Name            string `json:"name,omitempty"`
	StartArgs       string `json:"startArgs,omitempty"`
	TTY             string `json:"tty,omitempty"`
	Description     string `json:"description,omitempty"`
	Types           string `json:"types,omitempty"`
}

func (c *Client) GetProcessByPage(opt ProcessFilterOption) (int64, *[]Process, error) {
	if opt.OS != HostOSTypeWin && opt.OS != HostOSTypeLinux {
		return 0, &[]Process{}, fmt.Errorf("参数OS错误，可选值win、linux")
	}
	if opt.Size <= 0 {
		return 0, &[]Process{}, fmt.Errorf("参数size错误不能为0")
	}
	type resp struct {
		Total int64     `json:"total"`
		Rows  []Process `json:"rows"`
	}
	var result resp
	var api = "external/api/assets/process/" + opt.OS
	err := c.Request(http2.MethodGet, api, &result, opt)
	return result.Total, &result.Rows, err
}
